package cn.com.headfree.sysmenu.service.impl;

import cn.com.headfree.entity.IscUser;
import cn.com.headfree.sysmenu.dao.IRoleDao;
import cn.com.headfree.sysmenu.dao.IRoleMenuDao;
import cn.com.headfree.sysmenu.dao.IUserRoleDao;
import cn.com.headfree.sysmenu.entity.TSysMenu;
import cn.com.headfree.sysmenu.entity.TSysRole;
import cn.com.headfree.sysmenu.entity.TSysUserRole;
import cn.com.headfree.sysmenu.service.IRoleService;
import cn.com.headfree.sysmenu.vo.SysRoleVo;
import com.gta.edu.sdk.common.dto.Page;
import com.gta.edu.sdk.util.IdGen;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service("roleService")
public class RoleServiceImpl implements IRoleService {
    @Autowired
    IRoleDao roleDao;
    @Autowired
    IUserRoleDao userRoleDao;
    @Autowired
    IRoleMenuDao roleMenuDao;

    //查询角色列表
    @Override
    public List<TSysRole> findRoleList(SysRoleVo sysRole, String orgId) {
        return roleDao.findRoleList(sysRole, orgId);
    }

    //查询角色列表
    @Override
    public void getPageRole(Page<TSysRole> page, SysRoleVo sysRole, String orgId) {
        roleDao.getPageRole(page,sysRole,orgId);
    }

    //根据角色名称查询角色全部列表
    @Override
    public List<TSysRole> findRoleListByRoleName(String roleId, String roleName) {
        return roleDao.findRoleListByRoleName(roleId, roleName);
    }

    //新增角色
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void addRole(TSysRole sysRole){
        sysRole.setId(IdGen.uuid());
        roleDao.addRole(sysRole);
        this.insertRoleMenu(sysRole);
    }
    //新增角色菜单信息
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void insertRoleMenu(TSysRole sysRole){
        // 新增用户与角色管理
       /* List<TSysRoleMenu> list = new ArrayList<TSysRoleMenu>();
        for (String menuId : sysRole.getMenuIds())
        {
            TSysRoleMenu rm = new TSysRoleMenu();
            rm.setRoleId(sysRole.getId());
            rm.setMenuId(menuId);
            list.add(rm);
            roleMenuDao
        }
        if (list.size() > 0)
        {
            roleMenuDao.batchRoleMenu(list);
        }*/
        String values = "";
        for (String menuId : sysRole.getMenuIds())
        {
            values += "('"+ IdGen.uuid()+"','"+sysRole.getId()+"','"+menuId+"'),";
        }
        if (StringUtils.isNotBlank(values))
        {
            if(values.endsWith(",")){
                values=values.substring(0,values.length()-1);
            }
            roleMenuDao.batchRoleMenu(values);
        }
    }

    //更新角色
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateRole(TSysRole sysRole){
        roleDao.updateRole(sysRole);
        // 删除角色与菜单关联
        roleMenuDao.deleteRoleMenuByRoleId(sysRole.getId());
        this.insertRoleMenu(sysRole);
    }

    //更新角色状态
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateRoleStatus(TSysRole sysRole){
        roleDao.updateRoleStatus(sysRole);
    }

    //删除角色
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteRole(String[] roleIds){
        // 删除角色与菜单关联
        roleMenuDao.deleteRoleMenu(roleIds);
        // 删除角色
        roleDao.deleteRole(roleIds);
    }

    /**
     * 通过角色ID查询角色使用数量
     */
    @Override
    public int countUserRoleByRoleId(String roleId){
        List<TSysUserRole> list = userRoleDao.getUserRoleListByRoleId(roleId);
        return list.size();
    }

    /**
     * 通过用户ID查询用户角色列表
     */
    @Override
    public List<TSysUserRole> getUserRoleListByUserId(String userId){
        return userRoleDao.getUserRoleListByUserId(userId);
    }

    //根据用户ID查询角色id集合
    @Override
    public List<String> selectRoleIdListByUserId(String userId){
        List<TSysUserRole> list = userRoleDao.getUserRoleListByUserId(userId);
        return list.stream().map(TSysUserRole::getRoleId).collect(Collectors.toList());
    }

    /**
     * 查询已分配用户角色列表
     */
    @Override
    public void selectAllocatedPageUser(Page<IscUser> page, IscUser iscUser, String roleId){
        roleDao.selectAllocatedPageUser(page,iscUser,roleId);
    }

    /**
     * 查询未分配用户角色列表
     */
    @Override
    public void selectUnAllocatedPageUser(Page<IscUser> page, IscUser iscUser, String roleId){
        roleDao.selectUnAllocatedPageUser(page,iscUser,roleId);
    }

    /**
     * 批量取消授权用户
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteAuthUsers(String roleId,String[] userIds){
        for(String userId:userIds){
            userRoleDao.deleteAuthUsers(roleId,userId);
        }
    }

    /**
     * 批量选择用户授权
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveUserRole(String roleId,String[] userIds){
        for(String userId:userIds){
            userRoleDao.saveUserRole(roleId,userId);
        }
    }

    /**
     * 用户批量取消授权
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteAuthUsersByUserId(String userId,String[] roleIds){
        for(String roleId:roleIds){
            userRoleDao.deleteAuthUsers(roleId,userId);
        }
    }

    /**
     * 用户批量选择授权
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveUserRoleByUserId(String userId,String[] roleIds){
        for(String roleId:roleIds){
            userRoleDao.saveUserRole(roleId,userId);
        }
    }

    /**
     * 获取角色列表
     */
    @Override
    public List<TSysRole> getRoleList(String roleName, String roleCode, String status, String orgId){
        return roleDao.getRoleList(roleName, roleCode, status, orgId);
    }

    /**
     * 用户批量选择角色授权（先删除已关联角色，再新增关联角色）
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void addUserRoleByUserId(String userId,String[] roleIds){
        //删除已关联角色
        userRoleDao.deleteUserRoleByUserId(userId);
        //新增关联角色
        for(String roleId:roleIds){
            userRoleDao.saveUserRole(roleId,userId);
        }
    }
}
